package org.example;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * Flink DataStream API 编程示例
 * 本示例展示如何使用 Flink 的 DataStream API 进行流处理：
 * 1. 从文本流中读取数据。
 * 2. 使用 FlatMap 将每行文本拆分为单词，并转换为 (word, 1) 的元组。
 * 3. 按单词分组，累加计数，输出结果。
 * 适合初学者学习 Flink DataStream API 的基本使用。
 */
public class DataStreamAPIExample {

    public static void main(String[] args) throws Exception {
        // 创建流处理执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 设置并行度为 1，方便观察输出
        env.setParallelism(1);

        // 模拟输入数据流（实际应用中可能来自 Kafka、Socket 等）
        DataStream<String> textStream = env.fromElements(
            "Hello Flink",
            "Hello World",
            "Hello Flink"
        );

        // 使用 FlatMap 将每行文本拆分为单词，并转换为 (word, 1) 的元组
        DataStream<Tuple2<String, Integer>> wordCountStream = textStream
            .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
                @Override
                public void flatMap(String line, Collector<Tuple2<String, Integer>> out) {
                    for (String word : line.split(" ")) {
                        out.collect(new Tuple2<>(word, 1));
                    }
                }
            })
            // 按单词分组，并累加计数
            .keyBy(0)
            .sum(1);

        // 输出结果
        wordCountStream.print("DataStream API 处理结果");

        // 执行流处理作业
        env.execute("DataStream API Example");
    }
} 